/**
 * @import libs
 */
import { ref } from 'vue'
import { defineStore, storeToRefs } from 'pinia'
import md5 from "js-md5";
import { getAIRespond } from '@/stores/Axios/api.js'
import { nextTick } from 'vue'

// pinia -> usePetDoctorStaticMessStore
import { usePetDoctorStaticMessStore } from '@/stores/petDoctor/petDoctorStaticMess.js'

export const usePetDoctorPageStore = defineStore('petDoctorPage', () => {

    let { petDoctorChatList } = storeToRefs(usePetDoctorStaticMessStore())

    const { roleMy, roleOpponent } = usePetDoctorStaticMessStore()

    /**
     * 盐
     */
    const salt = 'szcyyds8848'

    /**
     * 兑换码正确内容 yyds
     */
    const redeemCodeRightContent = 'da15f39c852c9e708b8fb949625a05af'

    /**
     * 兑换码输入框内容
     */
    let redeemCodeValue = ref('')

    /**
     * 兑换码输入框占位内容
     */
    const redeemCodePlaceholder = ref('输入兑换码')

    /**
     * 聊天输入框内容
     */
    let chatInputValue = ref('')

    /**
     * 聊天输入框占位内容
     */
    let chatInputPlaceholder = ref('输入消息')

    /**
     * 当前AI是否在思考
     */
    let isThinking = ref(false)

    /**
     * 聊天滚动条高度
     */
    let chatScrollTopHeight = ref(0)

    /**
     * 滚动到最下面
     */
    const chatScrollToBottom = (content) => {
        //为空判断
        if (content == '') {
            return
        }

        //参数有效性检测
        if (content === undefined) {
            console.error('content is undefined')
            return
        }

        //一行的中文最大词数
        let count = content.length

        // 计算滚动高度
        let height = Math.ceil(count / 14) * 70;

        //下次更新
        nextTick(() => {
            chatScrollTopHeight.value += height
        })
    }
    /**
 * 验证兑换码内容
 * @param {String} value
 * @returns {*}
 */
    const checkRedeemCode = (value) => {
        // 判断value是否为undefined
        if (value === undefined) {
            console.error('value is undefined')
            return
        }

        // 去除首尾空格
        value = value.trim()

        // 判断value是否为空字符串
        if (value == '') {
            return
        }

        // 对value进行md5加盐加密
        value = md5.hmac.hex(value, salt)

        // 判断value是否为正确的兑换码
        if (value == redeemCodeRightContent) {

            //跳转页面

            let path = "/pages/petDoctor/childPage/chatPage"

            uni.navigateTo({ url: path })
        }
    }

    /**
     * 获取模式化对话内容
     */
    const getChatListModeContent = () => {
        let content = ''
        content += '以下是我和你之前的对话,'
        petDoctorChatList.value.forEach(item => {
            if (item.role == roleMy) {
                content += '我：' + item.content
            } else {
                content += '你：' + item.content
            }
        });
        content += '下面请直接回答我的问题，请不要喵，也不要提及你是宠物医生，内容不要超过五十个字，回答不要以好的开头'
        return content
    }

    /**
     * 在对话列表中新增内容
     * @param {String} content
     * @param {Number} role
     * @returns {*}
     */
    const addChatListContent = (content, role) => {

        // 参数有效性检测
        if (content === undefined) {
            console.error('content is undefined')
            return
        }

        if (role === undefined) {
            console.error('role is undefined')
            return
        }

        // 参数类型校验
        if (typeof content !== 'string') {
            console.error('content must be a string')
            return
        }

        if (typeof role !== 'number') {
            console.error('role must be a number')
            return
        }

        //内容为空判断
        if (content == '') {
            return
        }

        // 对话单元对象
        let obj = {}
        obj.id = petDoctorChatList.value.length
        obj.content = content
        obj.role = role

        petDoctorChatList.value.push(obj)
    }

    /**
     * 获取AI回复
     * @param {String} prompt
     * @returns {*}
     */
    const toGetAIRespond = (prompt) => {

        // 参数有效性检测
        if (prompt === undefined) {
            console.error('prompt is undefined')
            return
        }

        // 参数类型校验
        if (typeof prompt !== 'string') {
            console.error('prompt must be a string')
            return
        }

        // 内容为空判断
        if (prompt == '') {
            return
        }

        // 在对话列表中新增我的对话内容
        addChatListContent(prompt, roleMy)

        //对话滚动到最下面
        chatScrollToBottom(chatInputValue.value)

        // 获取模式化提问AI语句
        prompt = getChatListModeContent()

        // 开启AI思考状态
        isThinking.value = true

        // 对话输入框清空
        chatInputValue.value = ''

        // 修改输入框占位符内容为思考中提示语
        chatInputPlaceholder.value = '正在思考中…'

        // 调用AI接口
        getAIRespond(prompt)
            .then(response => {
                // 关闭AI思考状态
                isThinking.value = false

                // 在对话列表中新增AI回复内容
                chatInputPlaceholder.value = '输入消息'

                // 修改输入框占位符内容为用户输入消息提示语
                addChatListContent(response, roleOpponent)

                // 对话滚动到最下面
                chatScrollToBottom(response)
            })
            .catch(error => {
                console.error("Error fetching AI response:", error); // 处理错误
            });
    }

    /**
     * 聊天输入框input事件
     */
    const chatInputInput = () => {
        if (isThinking.value) {
            chatInputPlaceholder.value = '正在思考中'
        } else {
            chatInputPlaceholder.value = '输入消息'
        }
    }

    /**
     * 聊天输入框confirm事件
     */
    const chatInputConfirm = () => {
        if (isThinking.value) {
            //提示
            uni.showToast({
                title: '正在思考中',
                icon: 'none'
            })
            return
        }
        const value = chatInputValue.value

        // 判断value是否为undefined
        if (value === undefined) {
            console.error('value is undefined')
            return
        }

        // 判断value是否为空字符串
        if (value == '') {
            return
        }

        // 调用AI回复
        toGetAIRespond(value)
    }

    /**
     * 点击聊天区添加文件图标
     */
    const chatClickAddFile = () => {
        // 提示
        uni.showToast({
            title: '文件上传功能暂未开放',
            icon: 'none'
        })
    }

    /**
     * 点击聊天区发送表情包图标
     */
    const chatClickAddEmoji = () => {
        // 提示
        uni.showToast({
            title: '表情包功能暂未开放',
            icon: 'none'
        })
    }

    /**
     * 点击聊天区发送语音图标
     */
    const chatClickAddVoice = () => {
        // 提示
        uni.showToast({
            title: '语音功能暂未开放',
            icon: 'none'
        })
    }

    /**
     * 点击健康顾问头像
     */
    const chatClickAIHead = () => {

        // 提示
        uni.showToast({
            title: '健康顾问主页暂未开放',
            icon: 'none'
        })
    }

    return {
        redeemCodeValue,
        redeemCodePlaceholder,
        checkRedeemCode,
        chatInputValue,
        chatInputPlaceholder,
        chatInputInput,
        chatInputConfirm,
        chatScrollTopHeight,
        chatClickAddFile,
        chatClickAddEmoji,
        chatClickAddVoice,
        chatClickAIHead
    }
})
